<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
            滑动窗口--固定滑动窗口
            时间复杂度：O(n)，并不是两个循环就是O(n)，每个元素至多进去一次，出来一次，就是O(n * 2) 也就是O(n)
            空间复杂度：O(1)
        */
      var findAnagrams = function (s, p) {
        const ans = [];
        const cnt = new Array(26).fill(0);
        for (const c of p) {
          // cnt数组的定义：表示还需要匹配多少个字符，比如cnt['a'] = 2，表示还需要从s里面匹配到两个字符'a'
          cnt[c.charCodeAt() - "a".charCodeAt()]++;
        }
        let start = 0;
        let end = 0;
        while (end < s.length) {
          const c = s[end].charCodeAt() - "a".charCodeAt();
          // 当执行cnt[c]--表示匹配过了一个c字符，“还需要匹配的c字符”减少了一个
          cnt[c]--;
          while (cnt[c] < 0) {
            // ++意味着，start索引对应的字符之前匹配过减掉了，现在把他加回去，让他离开窗口
            cnt[s[start].charCodeAt() - "a".charCodeAt()]++; // 左端点字母离开窗口
            start++;
          }
          // end - start + 1和p.length的长度相等，意味着此时窗口内数组的元素长度和p的相等
          if (end - start + 1 === p.length) {
            ans.push(start);
          }
          end++;
        }
        return ans;
      };

      // console.log(findAnagrams("baa", "aa"));
      console.log(findAnagrams("cbaebabacd", "abc"));
    </script>
  </body>
</html>
